home *** CD-ROM | disk | FTP | other *** search
/ CD ROM Paradise Collection 4 / CD ROM Paradise Collection 4 1995 Nov.iso / graphics / 3dvect37.zip / MACROS.INC < prev    next >
Text File  |  1994-06-22  |  9KB  |  336 lines

  1. ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  2. ;
  3. ; Filename     : macros.inc
  4. ; Included from: Your Program
  5. ; Description  : Macros used throughout
  6. ;
  7. ; Written by: John McCarthy
  8. ;             1316 Redwood Lane
  9. ;             Pickering, Ontario.
  10. ;             Canada, Earth, Milky Way (for those out-of-towners)
  11. ;             L1X 1C5
  12. ;
  13. ; Internet/Usenet:  BRIAN.MCCARTHY@CANREM.COM
  14. ;         Fidonet:  Brian McCarthy 1:229/15
  15. ;   RIME/Relaynet: ->CRS
  16. ;
  17. ; Home phone, (905) 831-1944, don't call at 2 am eh!
  18. ;
  19. ; John Mccarthy would really love to work for a company programming Robots
  20. ; or doing some high intensive CPU work.  Hint. Hint.
  21. ;
  22. ; Send me your protected mode source code!
  23. ; Send me your Objects!
  24. ; But most of all, Send me a postcard!!!!
  25. ;
  26. ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  27.  
  28. pushw      macro ww  ; push word, used for pushing constants
  29.            mov ax,ww
  30.            push ax
  31.            endm
  32.  
  33. drawline   macro xx1,yy1,xx2,yy2,col
  34.            pushw xx1
  35.            pushw yy1
  36.            pushw xx2
  37.            pushw yy2
  38.            pushw col
  39.            call draw_line
  40.            endm
  41.  
  42. block      macro xx1,yy1,xx2,yy2,col
  43.            pushw xx1
  44.            pushw yy1
  45.            pushw xx2
  46.            pushw yy2
  47.            pushw col
  48.            call fill_block
  49.            endm
  50.  
  51. char       macro chr,xx,yy,fc ; plot character
  52.  
  53.            push ax bx cx dx
  54.            mov ax,chr
  55.            push ax
  56.            mov ax,xx
  57.            push ax
  58.            mov ax,yy
  59.            push ax
  60.            mov ax,0
  61.            push ax
  62.            call tgprintc
  63.  
  64.            pop dx cx bx ax
  65.            mov ax,chr
  66.            push ax
  67.            mov ax,xx
  68.            add ax,1
  69.            push ax
  70.            mov ax,yy
  71.            sub ax,1
  72.            push ax
  73.            mov ax,fc
  74.            push ax
  75.            call tgprintc
  76.            endm
  77.  
  78. ; macro to out a 16 bit value to an i/o port
  79.  
  80. out_16     macro register, value
  81.            ifdifi <register>, <dx> ; if dx not setup
  82.            mov dx, register        ; then select register
  83.            endif
  84.            ifdifi <value>, <ax>    ; if ax not setup
  85.            mov ax, value           ; then get data value
  86.            endif
  87.            out dx, ax              ; set i/o register(s)
  88. endm
  89.  
  90. ; macro to out a 8 bit value to an i/o port
  91.  
  92. out_8      macro register, value
  93.            ifdifi <register>, <dx> ; if dx not setup
  94.            mov dx, register        ; then select register
  95.            endif
  96.            ifdifi <value>, <al>    ; if al not setup
  97.            mov al, value           ; then get data value
  98.            endif
  99.            out dx, al              ; set i/o register
  100. endm
  101.  
  102. ; macros to push and pop multiple registers
  103.  
  104. pushx      macro r1, r2, r3, r4, r5, r6, r7, r8
  105.            ifnb <r1>
  106.            push r1                 ; save r1
  107.            pushx r2, r3, r4, r5, r6, r7, r8
  108.            endif
  109. endm
  110.  
  111. popx       macro r1, r2, r3, r4, r5, r6, r7, r8
  112.            ifnb <r1>
  113.            pop r1                  ; restore r1
  114.            popx r2, r3, r4, r5, r6, r7, r8
  115.            endif
  116. endm
  117.  
  118. ; macro to clear registers to 0
  119.  
  120. clr        macro register, r2, r3, r4, r5, r6
  121.            ifnb <register>
  122.            xor register, register  ; set register = 0
  123.            clr r2, r3, r4, r5, r6
  124.            endif
  125. endm
  126.  
  127. ; macros to decrement counter & jump on condition
  128.  
  129. loopx      macro register, destination
  130.            dec register            ; counter--
  131.            jnz destination         ; jump if not 0
  132. endm
  133.  
  134. loopjz     macro register, destination
  135.            dec register            ; counter--
  136.            jz destination          ; jump if 0
  137. endm
  138.  
  139. ; macro to multiply by a constant - this can be done because of protected
  140. ; mode's lea function.
  141. ;
  142. ; use: cmul eax,ecx,12   eax=ecx*12
  143. ; as opposed to using imul
  144.  
  145. cmul       macro result,value,constant  ; constant multiply, use fast lea
  146.  
  147.            if constant eq 7
  148.            lea result,[value*4+value]   ; 7 = %0111
  149.            shl value,1
  150.            add result,value
  151.            cdq
  152.  
  153.            elseif constant eq 8
  154.            lea result,[value*8]         ; 8 = %1000
  155.            cdq
  156.  
  157.            elseif constant eq 9
  158.            lea result,[value*8+value]   ; 9 = %1001
  159.            cdq
  160.  
  161.            elseif constant eq 10
  162.            shl value,1
  163.            lea result,[value*4+value]   ; 10 = %1010
  164.            cdq
  165.  
  166.            elseif constant eq 11
  167.            lea result,[value*2+value]   ; 11 = %1011
  168.            shl value,3
  169.            add result,value
  170.            cdq
  171.  
  172.            elseif constant eq 12
  173.            lea result,[value*2+value]   ; 12 = %1100
  174.            shl result,2
  175.            cdq
  176.  
  177.            elseif constant eq 13
  178.            lea result,[value*2+value]   ; 13 = %1101
  179.            shl result,2
  180.            add result,value
  181.            cdq
  182.  
  183.            elseif constant eq 14
  184.            shl value,1
  185.            lea result,[value*4+value]   ; 14 = %1110
  186.            shl value,1
  187.            add result,value
  188.            cdq
  189.  
  190.            elseif constant eq 15
  191.            lea result,[value*4+value]   ; 15 = %1111
  192.            shl value,1
  193.            lea value,[value*4+value]
  194.            add result,value
  195.            cdq
  196.  
  197.            elseif constant eq 240
  198.            shl value,4
  199.            lea result,[value*4+value]   ; 240 = %0 1111 0000
  200.            shl value,1
  201.            lea value,[value*4+value]
  202.            add result,value
  203.            cdq
  204.  
  205.            elseif constant eq 260
  206.            lea result,[value*4]         ; 260 = %1 0000 0100
  207.            shl value,8
  208.            add result,value
  209.            cdq
  210.  
  211.            elseif constant eq 280
  212.            shl value,3
  213.            lea result,[value*2+value]   ; 240 = %1 0001 1000
  214.            shl value,5
  215.            add result,value
  216.            cdq
  217.  
  218.            elseif constant eq 300
  219.            shl value,2
  220.            lea result,[value*2+value]   ; 300 = %1 0010 1100
  221.            shl value,3
  222.            lea value,[value*8+value]
  223.            add result,value
  224.            cdq
  225.  
  226.            elseif constant eq 320
  227.            lea result,[value*4+value]   ; 320 = %1 0100 0000
  228.            shl result,6
  229.            cdq
  230.  
  231.            elseif constant eq 360
  232.            shl value,3
  233.            lea result,[value*4+value]   ; 360 = %1 0110 1000
  234.            shl value,3
  235.            lea value,[value*4+value]
  236.            add result,value
  237.            cdq
  238.  
  239.            elseif constant eq 416
  240.            shl value,5
  241.            lea result,[value*4+value]   ; 416 = %1 1010 0000
  242.            shl value,3
  243.            add result,value
  244.            cdq
  245.  
  246.            elseif constant eq 448
  247.            lea result,[value*8]         ; 464 = %1 1100 0000
  248.            shl value,2
  249.            lea value,[value*4+value]
  250.            add result,value
  251.            shl result,4
  252.            cdq
  253.  
  254.            elseif constant eq 464
  255.            lea result,[value*8+value]   ; 464 = %1 1101 0000
  256.            shl value,2
  257.            lea value,[value*4+value]
  258.            add result,value
  259.            shl result,4
  260.            cdq
  261.  
  262.            elseif constant eq 480
  263.            shl value,5
  264.            lea result,[value*4+value]   ; 480 = %1 1110 0000
  265.            shl value,1
  266.            lea value,[value*4+value]
  267.            add result,value
  268.            cdq
  269.  
  270.            elseif constant eq 2980h
  271.            shl value,7
  272.            lea result,[value*2+value]   ; 2980 = %10 1001 1000 0000
  273.            shl value,4
  274.            lea value,[value*4+value]
  275.            add result,value
  276.            cdq
  277.  
  278.            elseif constant eq 2d00h
  279.            shl value,8                  ; 2d41/4000h = cos(45degrees) = sin(45)
  280.            lea result,[value*4+value]   ; 2d00h = %0010 1101 0000 0000
  281.            shl value,3                  ; 2d41/2d00 = 99.2% correct!
  282.            lea value,[value*4+value]
  283.            add result,value
  284.            cdq
  285.  
  286.            else
  287.            mov result,constant
  288.            imul value
  289.            display "Note: Slow multiplication used in constant multiply"
  290.            display "      See cmul macro in file macros.inc"
  291.            endif
  292.  
  293. endm
  294.  
  295. ; convert 16-bit segment, 16-bit offset to 32-bit flat pointer
  296. ; ( segment, offset in 32-bit registers OR immediate values )
  297.  
  298. @segoff2ptr   macro   ptr32, seg16, off16
  299.               mov     &ptr32, &seg16
  300.               shl     &ptr32, 4
  301.               add     &ptr32, &off16
  302.               sub     &ptr32, _code32a
  303.               endm
  304.  
  305. ; convert 32-bit flat pointer to 16-bit segment, 16-bit offset
  306. ; ( segment, offset in 32-bit registers )
  307.  
  308. @ptr2segoff   macro   ptr32, seg16, off16
  309.               add     &ptr32, _code32a
  310.               mov     &off16, &ptr32
  311.               and     &off16, 0ffffh
  312.               mov     &seg16, &ptr32
  313.               shr     &seg16, 4
  314.               and     &seg16, 0f000h
  315.               endm
  316.  
  317. ; wait for escape key
  318.  
  319. @waitesc      macro
  320.               local   lab1, lab2
  321. lab1:         in      al, 60h
  322.               cmp     al, 1
  323.               jne     lab1
  324. lab2:         in      al, 60h
  325.               cmp     al, 1
  326.               je      lab2
  327.               endm
  328.  
  329. b             equ byte ptr
  330. w             equ word ptr
  331. d             equ dword ptr
  332. o             equ offset
  333. f             equ far ptr
  334. s             equ short
  335.  
  336.